# -*- coding:utf-8 -*-

from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from app import db, login_manager


class Staff(UserMixin, db.Model):
    __tablename__ = 'staff'
    id = db.Column(db.Integer, primary_key=True)  # 员工在数据库中的id
    staff_number = db.Column(db.String(14), unique=True)  # 员工编号，有唯一性
    password_hash = db.Column(db.String(128))  # 密码的hash值
    name = db.Column(db.String(64))  # 员工姓名
    sex = db.Column(db.Boolean)  # 员工性别，0为女，1为男
    phone = db.Column(db.String(23), unique=True, index=True)  # 员工手机
    email = db.Column(db.String(64))  # 员工email
    role = db.Column(db.String(45))  # 员工的角色（有10大角色，分别具有不同的权限）
    account_state = db.Column(db.SmallInteger)  # 账户状态,0为正常，1为冻结
    created = db.Column(db.DateTime)  # 账户创建时间
    last_login_ip = db.Column(db.String(20))  # 上次登录ip
    last_login_time = db.Column(db.DateTime)  # 上次登录时间
    last_login_area = db.Column(db.String(45))  # 上次登录地点

    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

    @login_manager.user_loader
    def load_users(staff_id):
        return Staff.query.get(int(staff_id))

    def __repr__(self):
        return '<Staff %s>' % self.staff_number

    def save(self):
        db.session.add(self)
        db.session.commit()


class User(UserMixin, db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)  # 用户在数据库中的id
    user_number = db.Column(db.String(14), unique=True)  # 用户编号，有唯一性
    password_hash = db.Column(db.String(128))  # 密码hash值
    name = db.Column(db.String(45))  # 用户姓名
    phone = db.Column(db.String(23), unique=True)  # 用户手机号
    address = db.Column(db.String(64))  # 用户地址
    user_type = db.Column(db.SmallInteger, nullable=False)  # 用户的类型（1为商家，2为个人）
    area = db.Column(db.String(45))  # 所在地区
    logo = db.Column(db.String(128)) #用户头像

    # 以下十个字段只有当user_type的值为商家时才有意义
    company_name = db.Column(db.String(45))  # 公司名称
    company_tel = db.Column(db.String(20))  # 公司电话
    company_address = db.Column(db.String(64))  # 公司地址
    corporation_name = db.Column(db.String(45))  # 法人姓名
    intro = db.Column(db.Text)  # 公司简介
    business_license = db.Column(db.String(45))  # 营业执照图片的url
    contact_name = db.Column(db.String(45))  # 公司联系人
    contact_phone = db.Column(db.String(20))  # 联系人电话
    upgrade_date = db.Column(db.DateTime)  # 从个人用户升级为商家时的日期
    register_type = db.Column(db.SmallInteger)  # 商家的注册类型，0为平台注册，1为个人升级
    # 到此共计十个字段

    register_date = db.Column(db.DateTime)  # 注册时间
    account_state = db.Column(db.SmallInteger)  # 账户状态, 0为正常，1为冻结

    car_collect = db.relationship('Collect', backref='user', lazy='dynamic')

    def __repr__(self):
        return '<User %s>' % self.user_number

    def save(self):
        db.session.add(self)
        db.session.commit()


class DefPassword(UserMixin, db.Model):
    __tablename__ = 'def_pass'  # 新员工默认密码
    id = db.Column(db.Integer, primary_key=True)
    default_password = db.Column(db.String(45))

    def save(self):
        db.session.add(self)
        db.session.commit()


class Upgrade(db.Model):  # 该表用于记录商家的账户申请，包括初始注册，个人升级，商家信息修改三类
    __tablename__ = 'upgrade'
    id = db.Column(db.Integer, primary_key=True)
    number = db.Column(db.String(14))  # 申请的编号
    name = db.Column(db.String(45))  # 用户姓名
    phone = db.Column(db.String(23), unique=True)  # 用户手机号
    address = db.Column(db.String(64))  # 用户地址
    password_hash = db.Column(db.String(128))  # 商家密码的hash值，初始注册时该字段才有意义
    company_name = db.Column(db.String(45))  # 公司名称
    company_tel = db.Column(db.String(20))  # 公司电话
    company_address = db.Column(db.String(45))  # 公司地址
    area = db.Column(db.String(45))  # 所在地区
    corporation_name = db.Column(db.String(45))  # 法人姓名
    intro = db.Column(db.Text)  # 公司简介
    business_license = db.Column(db.String(45))  # 营业执照图片的url
    contact_name = db.Column(db.String(45))  # 公司联系人的姓名
    contact_phone = db.Column(db.String(20))  # 公司联系人的电话
    submission_time = db.Column(db.DateTime)  # 申请提交的时间
    application_type = db.Column(db.SmallInteger)  # 申请的类型，0为初始注册，1为个人用户升级，2为商家修改个人信息
    user_id = db.Column(db.Integer)  # 原账户的id，申请类型为1与2时该字段才有意义
    state = db.Column(db.SmallInteger)  # 申请的状态，0为待审，1为审核通过，2为拒绝
    reject_reason = db.Column(db.Text)  # 申请拒绝的原因，state为2时该字段才有意义

    @property
    def password(self):
        return self.password_hash

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def save(self):
        db.session.add(self)
        db.session.commit()


class Collect(db.Model):
    __tablename__ = 'car_collect'
    id = db.Column(db.Integer, primary_key=True)
    collect_date = db.Column(db.DateTime, nullable=False)
    car_id = db.Column(db.Integer, db.ForeignKey('car.id'), nullable=False)
    uid = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    car = db.relationship('Car', backref='car_collect', lazy='joined')


class Freeze(db.Model):  # 该表用于记录账户的冻结历史，即违规记录
    __tablename__ = 'freeze'
    id = db.Column(db.Integer, primary_key=True)
    number = db.Column(db.String(14))  # 冻结的编号
    user_id = db.Column(db.Integer)  # 被冻结账户的id
    reason = db.Column(db.Text)  # 冻结原因
    freeze_id = db.Column(db.Integer)  # 执行冻结操作的员工的id
    freeze_name = db.Column(db.String(45))  # 执行冻结操作的员工的姓名
    freeze_time = db.Column(db.DateTime)  # 冻结的时间
    recovery_id = db.Column(db.Integer)  # 执行恢复操作的员工的id
    recovery_name = db.Column(db.String(45))  # 执行恢复操作的员工的姓名
    recovery_time = db.Column(db.DateTime)  # 恢复的时间
    
    def save(self):
        db.session.add(self)
        db.session.commit()
